package com.study.kt._01grammar._01basic

/**
 * kotlin中只有基本数据类型，会根据场景自动选择时基本类型还是包装类型，
 */
fun main() {

    //显式指定变量类型
    var age: Int = 10
    var l: Long = 12L//定以后默认为基本类型
    l.hashCode();//调用了变量的方法自动转换为包装类型
    //编译器根据变量值自动推断类型
    var name = "fauks"

    //定义常量且不可再次赋值，首选val 因为不可变更安全，相当于final
    val score: Float = 10.3f
    //局部常量可以不赋初值，可以在第一次使用时赋值
    //在类中定义的成员常量可以直接赋值也可以在构造方法赋值
    val desc: String

    // 转移字符支持，不需要使用 大量 \
    var s2: String = """
        hello \n world
    """.trimIndent()



    //Kotlin中所有基本类型都是包装类型，而且不允许赋null值，如果要赋null必须使用?类型
    //Int最终解析为Java基本类型int，Int?最终解析为int包装类型Integer
    var notnullNum: Int = 12
    var nulNum: Int? = null

    var intNum1: Int = 1233
    var intNum2: Int = 1233

    //===必须值相等地址相同，true，最终解析为基本类型仅仅比较值
    println(intNum1 === intNum2)

    //false，Int?是包装类型最终两个对象地址不同所以返回false
    //如果下面的值换位-127~128的值就返回true，由于Java Integer缓存特性导致
    var intNum3: Int? = 1333
    var intNum4: Int? = 1333
    println(intNum3 === intNum4)

    //二进制
    var binNum = 0b1100
    //十六进制
    var hexNum = 0xaf
    //不支持8进制整形
    println("二进制数值为${binNum}")
    println("十六进制数值为${hexNum}")
    //为了增强可读性，允许对数字添加下划线分组
    var phone = 185_6194_0631

    //浮点数,如果浮点型不显示声明默认为double
    //所有浮点型必须有. 否则为整形
    var floatNum = 12.9f
    var doubleNum: Double = 12.9
    //还可以使用科学计数法表示浮点型，而且仅浮点型支持科学计数
    var largeNum = 12E2
    println(largeNum)

    //浮点类型三个特殊值而且仅限浮点类型,所有无穷数都相等(正负)，所有非数都不等包括和自己
    //正无穷大，任何一个整数除0
    println(12.4 / 0.0)
    println(12.4 / 0.0 == 11.4 / 0.0)
    //负无穷大
    println(-12.4 / 0.0)
    //非数
    println(0.0 / 0.0)
    println(0.0 / 0.0 == 0.0 / 0.0)

    //Char类型,不同于Java Kotlin中Char与Int不能互转
    var aChar: Char = 'a'
    var enterChar: Char = '\r'
    val chChar: Char = '\u9999'
    println(chChar)

    //不同于Java，Kotlin不支持将取值范围小的直接转换为取值范围大的

    //字符串,使用trimMargin去空格，表示去掉|前的空格，|可以为任意字符
    //kotlin中 equals ==用处相同，如果要比较绝对等于使用===
    val city = """
            |中国
         |山东
                |青岛
    """.trimMargin("|")
    println(city)

    //输出函数
    println("a=${city} 可以省略{} b=$name")
    //输入函数
    val readLine = readLine()
}